package main.core;

import java.io.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import main.beans.Adotante;
import main.beans.Animal;
import main.beans.Doenca;
import main.interfaces.Cadastravel;

public class ControladorArquivo {
    
    private FileOutputStream fileOut;
    private ObjectOutputStream objectOut;
    private FileInputStream fileIn;
    private ObjectInputStream objectIn;
    
    private List<Cadastravel> lista;
    
    private String bar = File.separator;
    private String path;
    
    public ControladorArquivo() {
        this.lista = new LinkedList<>();
    }
    
    
    
    public static void main (String[] args) throws Exception {
//        Cadastravel bla = new Adotante("pessoa", "05214523698");
//        Cadastravel bla2 = new Adotante("joao", "05214523698");
//        Cadastravel animal = new Animal("toto", "cachorro", "asueh", 1, "MARROM");
//        Doenca bla3 = new Doenca("grude", 1);
//        Doenca bla4 = new Doenca("grude", 2);
        
//        bla3.setDescricao("ai");
//        bla4.setDescricao("aiaiai");
        
        ControladorArquivo gerenciador = new ControladorArquivo();
        
//        gerenciador.save(bla);
//        gerenciador.save(bla2);
//        gerenciador.save(bla3);
//        gerenciador.save(bla4);
//        gerenciador.save(animal);
        gerenciador.load(Cadastravel.ADOTANTE);
        
        System.out.println(Arrays.toString((gerenciador.pesquisa("chico")).toArray()));
        
    }
    
    public List<Cadastravel> pesquisa (String nome) {
        
        ListIterator iterador = lista.listIterator();
        List<Cadastravel> listaResultante = new LinkedList<>();
        
        while (iterador.hasNext()) {
            Cadastravel cadastravel = (Cadastravel) iterador.next();
            if (cadastravel.getNome().equals(nome.toLowerCase()))
                listaResultante.add(cadastravel);
        }
        return listaResultante;
    }
    
    public boolean save (Cadastravel entidade) {
        try {
            String fileName  = entidade.getNumeroCadastro() + ".pc";
            String assetPack = "" + entidade.getClass(); 
            assetPack        = (assetPack.substring(assetPack.lastIndexOf(".")+1)).toLowerCase();
            path             = "src" + bar + "assets" + bar + assetPack + bar + fileName;
            
            fileOut = new FileOutputStream(path);
            objectOut = new ObjectOutputStream(fileOut);
            
            List<Cadastravel> entidadesCadastradas;
            entidadesCadastradas = pesquisa(entidade.getNome());
            if (entidadesCadastradas.isEmpty())
                objectOut.writeObject(entidade);

            fileOut.close();
            objectOut.close();
            return true;
        }
        catch (IOException ex) {
            System.out.println("ERRO: " + ex.getMessage()) ;
            return false;
        }
    }
    
    public boolean load (int typeIndex) {
        try {
        String[] classType = {"adotante", "animal", "doenca"};
        path = "src" + bar + "assets" + bar + classType[typeIndex];
        
        File diretorio = new File(path);
        File[] fileList = diretorio.listFiles();
        
        for (File file : fileList) {
            fileIn = new FileInputStream(file.getPath());
            objectIn = new ObjectInputStream(fileIn);
            Cadastravel cadastravel = (Cadastravel) objectIn.readObject();
            lista.add(cadastravel);
        }
        fileIn.close();
        objectIn.close();
        return true;
        }
        catch (IOException | ClassNotFoundException ex) {
            System.out.println("ERRO: " + ex.getMessage());
            return false;
        }
    }
}